package com.ruoyi.common.utils;

import com.google.gson.Gson;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.ruoyi.common.entity.StorageConfig;
import com.ruoyi.common.service.StorageConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 七牛云文件上传工具类
 * @author 0617
 * @version 1.0
 * @date 2025/8/20 下午11:54
 */
@Component
public class QiNiuUploadUtils {

    @Autowired
    private StorageConfigService storageConfigService;

    /**
     * 上传文件到七牛云
     * @param file 待上传的文件
     * @return 结果列表 [文件名, 文件访问URL]
     */
    public List<String> upload(MultipartFile file) {
        // 1. 从数据库获取七牛云配置
        StorageConfig qiniuConfig = storageConfigService.getByStorageType("qiniu");
        if (qiniuConfig == null) {
            throw new RuntimeException("未配置七牛云存储信息，请先在系统中配置");
        }

        // 2. 解析配置参数
        String accessKey = qiniuConfig.getAccessKey();
        String secretKey = qiniuConfig.getSecretKey();
        String bucketName = qiniuConfig.getBucketName();
        String domain = qiniuConfig.getDomain(); // 七牛云域名（如：xxx.bkt.clouddn.com）

        // 校验必要配置
        if (accessKey == null || secretKey == null || bucketName == null || domain == null) {
            throw new RuntimeException("七牛云配置不完整，请检查AccessKey、SecretKey、Bucket和Domain");
        }

        // 3. 生成随机文件名（UUID + 原文件后缀）
        String fileName = getRandomImgName(file.getOriginalFilename());

        // 4. 初始化七牛云配置
        // 根据实际存储区域选择，autoRegion()可自动识别，也可指定具体区域如Region.huadong()
        Configuration cfg = new Configuration(Region.autoRegion());
        UploadManager uploadManager = new UploadManager(cfg);

        try {
            // 5. 准备上传数据
            byte[] uploadBytes = file.getBytes();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucketName);

            // 6. 执行上传
            Response response = uploadManager.put(uploadBytes, fileName, upToken);

            // 7. 解析上传结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            System.out.println("七牛云上传成功，key: " + putRet.key + ", hash: " + putRet.hash);

            // 8. 构建返回结果 [文件名, 完整访问URL]
            List<String> result = new ArrayList<>();
            result.add(fileName);
            // 拼接完整URL（域名 + 文件名）
            String fileUrl = domain.endsWith("/") ? domain + fileName : domain + "/" + fileName;
            result.add(fileUrl);

            return result;

        } catch (QiniuException e) {
            // 七牛云上传异常处理
            Response r = e.response;
            try {
                throw new RuntimeException("七牛云上传失败：" + r.bodyString());
            } catch (QiniuException ex) {
                throw new RuntimeException("七牛云上传失败，错误信息获取异常");
            }
        } catch (Exception e) {
            // 其他异常处理
            throw new RuntimeException("文件上传失败：" + e.getMessage());
        }
    }

    /**
     * 生成随机文件名（UUID + 原文件后缀）
     * @param originalFilename 原文件名
     * @return 随机文件名
     */
    public static String getRandomImgName(String originalFilename) {
        if (originalFilename == null || originalFilename.isEmpty()) {
            throw new IllegalArgumentException("原文件名不能为空");
        }

        int index = originalFilename.lastIndexOf(".");
        String suffix = index == -1 ? "" : originalFilename.substring(index).toLowerCase();

        // 生成UUID并移除横线
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");

        return uuid + suffix;
    }
}
